x86: Process only pending timers in acpi idle handler, not all
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 6 Jul 2009 10:46:22 +0000 (11:46 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 6 Jul 2009 10:46:22 +0000 (11:46 +0100)
softirqs. This fixes a bug where bailing into SCHEDULE_SOFTIRQ may not
actually return.

From: Ke Yu <ke.yu@intel.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/acpi/cpu_idle.c

index 4d591c857e57f23e65bd9434679572589d30c73a..98d642f975311708217e97f7545ecbb9199de37d 100644 (file)
@@ -225,13 +225,8 @@ static void acpi_processor_idle(void)
     cpufreq_dbs_timer_suspend();
 
     sched_tick_suspend();
-    /*
-     * sched_tick_suspend may raise TIMER_SOFTIRQ by __stop_timer,
-     * which will break the later assumption of no sofirq pending,
-     * so add do_softirq
-     */
-    if ( softirq_pending(smp_processor_id()) )
-        do_softirq();
+    /* sched_tick_suspend() can raise TIMER_SOFTIRQ. Process it now. */
+    process_pending_timers();
 
     /*
      * Interrupts must be disabled during bus mastering calculations and